package org.thinkinbunny.financial.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间日期处理工具包,从String到Date的转换以及从String到Date的转换<br>
 * 等格式化处理
 * original author(William) all rights reserved
 * @author William E-Mail:feng_dreaming@163.com
 * @since 2010-4-15
 * @see java.util.Date<br>
 * 		java.text.SimpleDateFormat<br>
 * 		java.util.Calendar
 * **/
public class DateUtil {
	private static final String FORMAT_0 = "yyyy-MM-dd HH:mm:ss";
	private static final String FORMAT_1 = "yyyy-MM-dd";
	private static final String FORMAT_2 = "HH:mm:ss";
	/**
	 * 如果参数长度不为为0,则取第一个参数进行格式化，<br>
	 * 否则取当前日期时间，精确到秒 如:2010-4-15 9:36:38
	 * 
	 * @param Date
	 *            ... 可变参数
	 * @return java.lang.String
	 * **/
	public static String toFull(Date... date) {
		SimpleDateFormat simple = new SimpleDateFormat(FORMAT_0);
		if (date.length > 0) {
			return simple.format(date[0]);
		}
		return simple.format(new Date());
	}


	public static ArrayList getWeekBill() {

		Date mdate=new Date(System.currentTimeMillis());
		int b=mdate.getDay();
		Date fdate ;
		ArrayList  list = new ArrayList();
		Long fTime=mdate.getTime()-b*24*3600000;
		for(int a=0;a<7;a++){	  
			fdate= new Date();
			fdate.setTime(fTime+(a*24*3600000));

			list.add(String.format("%1$tY-%1$tm-%1$td", fdate));
			Log.i("xiawei", "getWeekBill"+String.format("%1$tY-%1$tm-%1$td", fdate));
		}
		return list;

		//  weekStart.getTime().toString()
	}


	public static  String getMonthBill() {

//		Date today=new Date();
//		SimpleDateFormat formats = new SimpleDateFormat("yyyy-MM-dd"); 
//		System.out.println("Today is "+formats.format(today));
//
//		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-01");
//
//		Date firstDay=new Date();
//
//		System.out.println("the month first day is "+formats.format(firstDay));
//
//		Calendar cal = Calendar.getInstance();
//
//		int maxDay=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
//
//		java.text.Format formatter3=new java.text.SimpleDateFormat("yyyy-MM"+maxDay);
//
//		System.out.println(formatter3.format(cal.getTime())); 
		
		Calendar cal = Calendar.getInstance();

		

		SimpleDateFormat monthFormat=new SimpleDateFormat("yyyy-MM");

		//System.out.println(monthFormat.format(cal.getTime()));

		return monthFormat.format(cal.getTime());

	}
	/**
	 * 如果参数长度不为为0,则取第一个参数进行格式化，<br>
	 * 否则取当前日期 如:2010-4-15
	 * 
	 * @param Date
	 *            ... 可变参数
	 * @return java.lang.String
	 * **/
	public static String toDate(Date... date) {
		SimpleDateFormat simple = new SimpleDateFormat(FORMAT_1);
		if (date.length > 0) {
			return simple.format(date[0]);
		}
		return simple.format(new Date());
	}

	/**
	 * 如果参数长度不为为0,则取第一个参数进行格式化，<br>
	 * 否则取当前日期时间，精确到秒<br>
	 * 如:9:36:38
	 * 
	 * @param Date
	 *            ... 可变参数
	 * @return java.lang.String
	 * **/
	public static String toTime(Date... date) {
		SimpleDateFormat simple = new SimpleDateFormat(FORMAT_2);
		if (date.length > 0) {
			return simple.format(date[0]);
		}
		return simple.format(new Date());
	}

	/**
	 * 根据字符串格式去转换相应格式的日期和时间
	 * 
	 * @param java.lang.String 必要参数
	 * @return java.util.Date
	 * @exception java.text.ParseException
	 *                如果参数格式不正确会抛出此异常
	 * **/
	public static Date getDateInfo(String date) {
		SimpleDateFormat simple = null;
		switch (date.trim().length()) {
		case 19:// 日期+时间
			simple = new SimpleDateFormat(FORMAT_0);
			break;
		case 10:// 仅日期
			simple = new SimpleDateFormat(FORMAT_1);
			break;
		case 8:// 仅时间
			simple = new SimpleDateFormat(FORMAT_2);
			break;
		default:
			return null;

		}
		try {
			return simple.parse(date.trim());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 将带有时、分、秒格式的日期转化为00:00:00<br>
	 * 方便日期推算,格式化后的是yyyy-MM-dd 00:00:00
	 * @param java.util.Date... date的长度可以为0,即不用给参数
	 * @return java.util.Date
	 * **/
	public static Date startOfADay(Date... date){
		SimpleDateFormat simple = new SimpleDateFormat(FORMAT_1);
		Date date_ = date.length == 0? new Date() : date[0];//如果date为null则取当前时间
		String d = simple.format(date_);
		try {
			return simple.parse(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 推算一个月内向前或向后偏移多少天,当然推算年也可以使用
	 * @param date 要被偏移的日期,<br>
	 * 		  amout 偏移量<br>
	 *        b 是否先将date格式化为yyyy-MM-dd 00:00:00 即:
	 *        是否严格按整天计算
	 * @return java.util.Date
	 * **/
	public static Date addDayOfMonth(Date date,Integer amount,Boolean b){
		date = date == null ? new Date():date;//如果date为null则取当前日期
		if(b){
			date = startOfADay(date);
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DAY_OF_MONTH, amount);
		return cal.getTime();
	}
	/**
	 * 推算一个小时内向前或向后偏移多少分钟,除了秒、毫秒不可以以外,其他都可以
	 * @param date 要被偏移的日期,<br>
	 * 		  amout 偏移量<br>
	 *        b 是否先将date格式化为yyyy-MM-dd HH:mm:00 即:
	 *        是否严格按整分钟计算
	 * @return java.util.Date
	 * **/
	public static Date addMinuteOfHour(Date date,Integer amount,Boolean b){
		date = date == null ? new Date():date;//如果date为null则取当前日期
		if(b){
			SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:00");
			try {
				date = simple.parse(simple.format(date));
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MINUTE, amount);
		return cal.getTime();
	}

//	public static void main(String[] args) {
//		System.out.println(DateUtil.addMinuteOfHour(new Date(),60,false));
//	}

}